<?php

/**
 * Обертка для сессии пользователя
 *
 */
abstract class Security_Session
{
    /**
     * Наименование переменной сессии, в которой хранится идентификатор
     * аккаунта текущего пользователя.
     *
     */
    const SESSION_VAR = 'LOGGED_SUBJECT_ID';

    /**
     * Регистрирует указанный аккаунт в системе безопасности.
     *
     * @param   integer $account_id
     */
    static public function register($account_id) {
        $_SESSION[self::SESSION_VAR] = $account_id;
    }

    /**
     * Возвращает идентификатор текущего субъекта безопасности.
     *
     * @return  integer
     */
    static public function getSubjectId()
    {
        return get_array_element($_SESSION, self::SESSION_VAR);
    }

    /**
     * Возвращает идентификатор профайла указанной роли текущего субъекта
     * безопасности.
     *
     * @param   integer $role
     * @return  integer
     */
    // оказывается, пока не надо. как понадобится - раскомментируем
    static public function getProfileId($role)
    {
        if (!$id = self::getSubjectId()) {
            return null;
        }

        static $_cache = array();

        if (!array_key_exists($role, $_cache)) {
            $_cache[$role] = Security_Utils_Subject::getProfileId($id, $role);
        }

        return $_cache[$role];
    }

    /**
     * Возвращает, авторизован ли текущий субъект безопасности.
     *
     * @return  boolean
     */
    static public function isAuthorized()
    {
        return self::getSubjectId() > 0;
    }

    /**
     * Возвращает, принадлежит ли текущий субъект безопасности указанной роли.
     *
     * @return  boolean
     */
    static public function is($role)
    {
        return self::getProfileId($role) > 0;
    }

    /**
     * Разрушает пользовательскую сессию.
     *
     */
    static public function destruct()
    {
        unset($_SESSION[self::SESSION_VAR]);
    }
}
